home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Animation How-To
/
Animation How-to CD.iso
/
PLY
/
CHAPTER2
/
DICE
/
TUMBLE.BAS
< prev
Wrap
BASIC Source File
|
1994-01-01
|
7KB
|
270 lines
' TUMBLE.BAS
DECLARE SUB rotate (x, y, z)
COMMON SHARED rad, a, xrotate, yrotate, zrotate
TYPE Vector
x AS SINGLE
y AS SINGLE
z AS SINGLE
END TYPE
DIM cube(8) AS Vector, c(8) AS Vector, last(8) AS Vector, hist(8)
DIM f(8) AS Vector, fo(8) AS Vector, r(8) AS Vector, marker AS Vector
' set the screen up with pretty rainbow colors
SCREEN 12
WINDOW (-4, -2.2)-(4, 3.8)
pi = 3.1415926535#
rad = pi / 180
' A static reference cube
FOR v = 1 TO 8
READ c(v).x, c(v).y, c(v).z
NEXT v
DATA 1, 1, 1
DATA 1, 1, -1
DATA 1, -1, 1
DATA 1, -1, -1
DATA -1, 1, 1
DATA -1, 1, -1
DATA -1, -1, 1
DATA -1, -1, -1
OPEN "marker.inc" FOR OUTPUT AS #1
'DO WHILE INKEY$ = ""
FOR a = -1 TO 1.5 STEP .1
LINE (-3.15, a)-(-2.48, a)
LINE (2.48, a)-(3.15, a)
NEXT a
LOCATE 26, 10: PRINT "Corner"
LOCATE 27, 8: PRINT "Histogram"
LOCATE 26, 67: PRINT "Face"
LOCATE 27, 65: PRINT "Histogram"
FOR a = 1 TO 8
cube(a) = c(a)
NEXT a
minang = 0
mindiff = 20
FOR angle = 0 TO 360
an = (angle - 360) / 720
FOR a = 1 TO 8
cube(a) = c(a)
NEXT a
ang = angle * rad
factor = 90
xrotate = factor * (2 * SIN(ang) + SIN(3 * ang) / 3)
yrotate = factor * (2 * COS(ang) - COS(3 * ang) / 3)
zrotate = factor * (COS(2 * ang))
marker.x = 3
marker.y = 3
marker.z = 3
CALL rotate(marker.x, marker.y, marker.z)
FOR a = 1 TO 8
' semi - equal coverage tumbling
xo = -1.3
yo = 2.5
PSET (4 * an + xo, xrotate / 360 + yo), 4
PSET (4 * an + xo, yrotate / 360 + yo), 2
PSET (4 * an + xo, zrotate / 360 + yo), 1
'rotate
CALL rotate(cube(a).x, cube(a).y, cube(a).z)
IF (angle = 0) THEN
r(a).x = cube(a).x
r(a).y = cube(a).y
r(a).z = cube(a).z
END IF
NEXT a
'undraw the old ones
FOR a = 1 TO 8
CIRCLE (last(a).x, last(a).y), (last(a).z + 5) / 15, 0
NEXT a
FOR a = 1 TO 6
CIRCLE (fo(a).x, fo(a).y), .1, 0
NEXT a
LINE (last(1).x, last(1).y)-(last(2).x, last(2).y), 0
LINE (last(2).x, last(2).y)-(last(4).x, last(4).y), 0
LINE (last(3).x, last(3).y)-(last(1).x, last(1).y), 0
LINE (last(4).x, last(4).y)-(last(3).x, last(3).y), 0
LINE (last(5).x, last(5).y)-(last(6).x, last(6).y), 0
LINE (last(6).x, last(6).y)-(last(8).x, last(8).y), 0
LINE (last(8).x, last(8).y)-(last(7).x, last(7).y), 0
LINE (last(7).x, last(7).y)-(last(5).x, last(5).y), 0
LINE (last(1).x, last(1).y)-(last(5).x, last(5).y), 0
LINE (last(2).x, last(2).y)-(last(6).x, last(6).y), 0
LINE (last(3).x, last(3).y)-(last(7).x, last(7).y), 0
LINE (last(4).x, last(4).y)-(last(8).x, last(8).y), 0
'draw the new ones
maxz = 0
FOR a = 1 TO 8
'CIRCLE (cube(a).x, cube(a).y), (cube(a).z + 5) / 15,INT((cube(a).z + 2) * 4)
CIRCLE (cube(a).x, cube(a).y), (cube(a).z + 5) / 15, a + 1
' IF a = 1 THEN PRINT #1, USING "##.###### ##.###### ##.######";cube(a).x, cube(a).y, cube(a).z
last(a) = cube(a)
IF (cube(a).z) > maxz THEN
maxz = cube(a).z
n = a
END IF
NEXT a
hist1(n) = hist1(n) + 1
' average z values for each face
f(1).x = (cube(1).x + cube(2).x + cube(3).x + cube(4).x) / 4
f(2).x = (cube(5).x + cube(6).x + cube(7).x + cube(8).x) / 4
f(3).x = (cube(1).x + cube(2).x + cube(5).x + cube(6).x) / 4
f(4).x = (cube(1).x + cube(3).x + cube(5).x + cube(7).x) / 4
f(5).x = (cube(3).x + cube(4).x + cube(7).x + cube(8).x) / 4
f(6).x = (cube(2).x + cube(4).x + cube(6).x + cube(8).x) / 4
f(1).y = (cube(1).y + cube(2).y + cube(3).y + cube(4).y) / 4
f(2).y = (cube(5).y + cube(6).y + cube(7).y + cube(8).y) / 4
f(3).y = (cube(1).y + cube(2).y + cube(5).y + cube(6).y) / 4
f(4).y = (cube(1).y + cube(3).y + cube(5).y + cube(7).y) / 4
f(5).y = (cube(3).y + cube(4).y + cube(7).y + cube(8).y) / 4
f(6).y = (cube(2).y + cube(4).y + cube(6).y + cube(8).y) / 4
f(1).z = (cube(1).z + cube(2).z + cube(3).z + cube(4).z) / 4
f(2).z = (cube(5).z + cube(6).z + cube(7).z + cube(8).z) / 4
f(3).z = (cube(1).z + cube(2).z + cube(5).z + cube(6).z) / 4
f(4).z = (cube(1).z + cube(3).z + cube(5).z + cube(7).z) / 4
f(5).z = (cube(3).z + cube(4).z + cube(7).z + cube(8).z) / 4
f(6).z = (cube(2).z + cube(4).z + cube(6).z + cube(8).z) / 4
maxz = -1
FOR a = 1 TO 6
CIRCLE (f(a).x, f(a).y), .1, a + 1
fo(a).x = f(a).x
fo(a).y = f(a).y
fo(a).z = f(a).z
IF (f(a).z) > maxz THEN
maxz = f(a).z
n = a
END IF
NEXT a
hist2(n) = hist2(n) + 1
LINE (cube(1).x, cube(1).y)-(cube(2).x, cube(2).y), 15
LINE (cube(2).x, cube(2).y)-(cube(4).x, cube(4).y), 15
LINE (cube(3).x, cube(3).y)-(cube(1).x, cube(1).y), 15
LINE (cube(4).x, cube(4).y)-(cube(3).x, cube(3).y), 15
LINE (cube(5).x, cube(5).y)-(cube(6).x, cube(6).y), 15
LINE (cube(6).x, cube(6).y)-(cube(8).x, cube(8).y), 15
LINE (cube(8).x, cube(8).y)-(cube(7).x, cube(7).y), 15
LINE (cube(7).x, cube(7).y)-(cube(5).x, cube(5).y), 15
LINE (cube(1).x, cube(1).y)-(cube(5).x, cube(5).y), 15
LINE (cube(2).x, cube(2).y)-(cube(6).x, cube(6).y), 15
LINE (cube(3).x, cube(3).y)-(cube(7).x, cube(7).y), 15
LINE (cube(4).x, cube(4).y)-(cube(8).x, cube(8).y), 15
LOCATE 1, 1
offx1 = 40
offy1 = 100
offx2 = -30
offy2 = 100
scale = .04
diff = 0 ' sum of the distances from original orientation
FOR a = 1 TO 8
x1 = (a - offx1) * .08
y1 = (hist1(a) - offy1) * .01
x2 = (a - offx2) * .08
y2 = (hist2(a) - offy2) * .01
diff = diff + ((r(a).x - cube(a).x) ^ 2 + (r(a).y - cube(a).y) ^ 2 + (r(a).z - cube(a).z) ^ 2) ^ .5
LINE (x1, y1)-(x1 + scale, y1 + scale), a + 1, BF
IF a < 7 THEN LINE (x2, y2)-(x2 + scale, y2 + scale), a + 1, BF
COLOR a + 1
PRINT USING "### "; hist1(a);
NEXT a
LOCATE 2, 1
FOR a = 1 TO 6
COLOR a + 1
PRINT USING "### "; hist2(a);
NEXT a
PRINT
COLOR 15
IF angle > 100 THEN
IF mindiff > diff THEN
mindiff = diff
minang = angle
END IF
END IF
PRINT USING "#### "; angle; xrotate; yrotate; zrotate
PRINT #1, USING "if (frame > ###) { object { sphere<###.##,###.##,###.##>, 0.25 shiny__yellow }}"; angle; marker.x; marker.y; marker.z
CIRCLE (4 * an + 2, diff / 20 + 2), .01, 12
NEXT angle
CLOSE #1
SUB rotate (x, y, z)
x0 = x
y0 = y
z0 = z
x1 = x0
y1 = y0 * COS(xrotate * rad) - z0 * SIN(xrotate * rad)
z1 = y0 * SIN(xrotate * rad) + z0 * COS(xrotate * rad)
x2 = z1 * SIN(yrotate * rad) + x1 * COS(yrotate * rad)
y2 = y1
z2 = z1 * COS(yrotate * rad) - x1 * SIN(yrotate * rad)
x3 = x2 * COS(zrotate * rad) - y2 * SIN(zrotate * rad)
y3 = x2 * SIN(zrotate * rad) + y2 * COS(zrotate * rad)
z3 = z2
x = x3
y = y3
z = z3
END SUB